package com.connect.nio;

import com.dto.cnc.CncDTO;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.springframework.scheduling.annotation.EnableAsync;

import java.nio.charset.Charset;

@Slf4j(topic = "通讯业务类")
@EnableAsync
public class EchoHandler extends SimpleChannelInboundHandler<ByteBuf> {

    /*发送信息指令*/
    private String toCode;
    public EchoHandler(String toCode) {
        this.toCode = toCode;
    }
    /**
     * 向服务端发送数据
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx)  {
        log.info("客户端与服务端通道-开启：" + ctx.channel().localAddress() + "channelActive");
//        toCode = "<alarm><req>yes</req><auto>yes</auto></alarm>\n";
        //System.out.println("客户端准备发送的数据包：" + toCode);
        ctx.writeAndFlush(Unpooled.copiedBuffer(toCode, CharsetUtil.UTF_8)); // 必须有flush
    }

    /**
     * channelInactive
     * <p>
     * channel 通道 Inactive 不活跃的
     * <p>
     * 当客户端主动断开服务端的链接后，这个通道就是不活跃的。也就是说客户端与服务端的关闭了通信通道并且不可以传输数据
     */
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        log.info("客户端与服务端通道-关闭："
                + ctx.channel().localAddress()
                + "channelInactive");
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
        //System.out.println("读取客户端通道信息..");
        ByteBuf buf = msg.readBytes(msg.readableBytes());
        /**System.out.println(
                "客户端接收到的服务端信息:"
                        + ByteBufUtil.hexDump(buf)
                        + "; 数据包为:"
                        + buf.toString(Charset.forName("gbk")));*//*解析返回值*/
        Document doc = Jsoup.parse(String.valueOf(new StringBuffer(buf.toString(Charset.forName("gbk")))));//html为内容
      if (doc != null){

//            // nio通信（长连接）读数据
//            Element localtime = doc.getElementsByTag("localtime").first();//根据标签名找title元素
//            if (localtime != null) {
//                //    Date ss = new Date();
//                SimpleDateFormat format0 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
////    String time = format0.format(ss.getTime());//这个就是把时间戳经过处理得到期望格式的时间
////    LocalDateTime today = LocalDateTime.now();//从系统始终获取当前日期
//
//                System.out.println(localtime.text());
//            }

            /*报警信息*/
            Element alarmInfo = doc.getElementsByTag("v1").first();//根据标签名找title元素
           if (alarmInfo != null){
               CncDTO.setMessage(alarmInfo.text());
           }else {
               CncDTO.setMessage("[]");
           }

        } else{
            CncDTO.setMessage("通讯异常");
            ctx.close();
        }

    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
        System.out.println("异常退出:" + cause.getMessage());
    }


}